package com.atguigu.gmall.all.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author atguigu-mqx
 */
@Controller
public class ListController {

    @Autowired
    private ListFeignClient listFeignClient;

    //  检索数据！
    //  http://list.gmall.com/list.html?category3Id=61
    //  searchParam 用来接收用户输入的检索条件！
    @GetMapping("list.html")
    public String searchList(SearchParam searchParam, Model model){
        //  后台存储 searchParam ，trademarkParam  propsParamList trademarkList urlParam
        //  attrsList orderMap goodsList pageNo  totalPages
        Result<Map> result = listFeignClient.list(searchParam);
        //  SearchResponseVo : result.getData();
        //  urlParam : 记录用户检索条件的！
        String urlParam = makeUrlParam(searchParam);
        //  searchParam.getTrademark() = 1:小米
        String trademarkParam = makeTrademarkParam(searchParam.getTrademark());

        //  制作排序： 第一种存储map 数据，第二种存储实体类！ order=2:asc
        Map<String,Object> orderMap = this.makeOrderMap(searchParam.getOrder());
        //  平台属性面包屑： propsParamList
        //  这个泛型，要么是一个实体类，要么看做一个Map集合!
        List<Map<String,String>> propsParamList = makePropsParamList(searchParam.getProps());
        //  存储数据：
        model.addAttribute("orderMap",orderMap);
        model.addAttribute("propsParamList",propsParamList);
        model.addAttribute("trademarkParam",trademarkParam);
        model.addAttribute("urlParam",urlParam);

        //  searchParam.keyword
        model.addAttribute("searchParam",searchParam);
        //  trademarkList  attrsList  goodsList
        model.addAllAttributes(result.getData());
        //  返回检索页面！
        return "list/index.html";
    }

    /**
     * 制作排序！
     * @param order
     * @return
     */
    private Map<String, Object> makeOrderMap(String order) {
        //  声明一个map 集合
        Map<String, Object> orderMap = new HashMap<>();
        //  先判断
        if(!StringUtils.isEmpty(order)){
            //  order=1:asc 或 order=2:desc
            String[] split = order.split(":");
            if (split!=null && split.length==2){
                //  排序规则 hotScore price
                orderMap.put("type",split[0]);
                //  排序方式 asc:desc
                orderMap.put("sort",split[1]);
            }
        }else {
            //  给个默认值！
            //  排序规则 hotScore price
            orderMap.put("type","1");
            //  排序方式 asc:desc
            orderMap.put("sort","desc");
        }
        return orderMap;
    }

    /**
     * 平台属性面包屑
     * @param props
     * @return
     */
    private List<Map<String, String>> makePropsParamList(String[] props) {
        //  创建一个集合
        List<Map<String, String>> list = new ArrayList<>();
        //  判断
        if (props!=null && props.length>0){
            //  循环遍历
            for (String prop : props) {
                //  prop 类似于 4455:10g:运行内存 这样的数据！ 回显的时候，需要显示的属性名：属性值名
                String[] split = prop.split(":");
                if(split!=null && split.length==3){
                    Map<String, String> map = new HashMap<>();
                    map.put("attrId",split[0]);
                    map.put("attrValue",split[1]);
                    map.put("attrName",split[2]);
                    //  将map 放入集合中！
                    list.add(map);
                }
            }
        }
        return list;
    }

    /**
     * 品牌面包屑
     * @param trademark
     * @return
     */
    private String makeTrademarkParam(String trademark) {
        //  判断
        if (!StringUtils.isEmpty(trademark)){
            //  trademark = 1:小米
            String[] split = trademark.split(":");
            if (split!=null && split.length==2){
                //  返回数据
                return "品牌:"+split[1];
            }
        }
        return null;
    }

    /**
     * 记录用户检索条件
     * @param searchParam
     * @return
     */
    private String makeUrlParam(SearchParam searchParam) {
        //  字符串拼接：
        StringBuilder sb = new StringBuilder();
        //  判断是否根据关键字
        if (!StringUtils.isEmpty(searchParam.getKeyword())){
            sb.append("keyword=").append(searchParam.getKeyword());
        }

        //  判断是否根据分类Id
        if (!StringUtils.isEmpty(searchParam.getCategory3Id())){
            sb.append("category3Id=").append(searchParam.getCategory3Id());
        }

        if (!StringUtils.isEmpty(searchParam.getCategory2Id())){
            sb.append("category2Id=").append(searchParam.getCategory2Id());
        }

        if (!StringUtils.isEmpty(searchParam.getCategory1Id())){
            sb.append("category1Id=").append(searchParam.getCategory1Id());
        }

        //  判断用户是否根据品牌进了检索！
        String trademark = searchParam.getTrademark();
        if (!StringUtils.isEmpty(trademark)){
            //  继续拼接
            if (sb.length()>0){
                sb.append("&trademark=").append(trademark);
            }
        }

        //  判断用户是否通过平台属性值进行了过滤！
        String[] props = searchParam.getProps();
        if (props!=null && props.length>0){
            //  循环遍历
            for (String prop : props) {
                //  &props=4456:128g:内存
                //  继续追加拼接
                if (sb.length()>0){
                    sb.append("&props=").append(prop);
                }
            }
        }
        //  返回拼接之后的url！
        return "list.html?"+sb.toString();
    }
}
